<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>计算属性，侦听器</title>
</head>
<body>
    <div id="app">
        <!-- 此时调用一次，执行一次。方法不存在缓存 -->
        {{Upper()}}
        <!-- 计算属性，带有缓存,不需要加括号 -->
        {{Upper2}}
        <input type="text" v-model = "num1">
        <input type="text" v-model = "num2">{{num3}}
    </div>
    <script>
        new Vue({
            el:'#app',
            data:{
                msg:'vue computed',
                num1:0,
                num2:0,
                num3:0,
                obj:{
                    abc:100
                }
            },
            methods:{
                Upper(){
                    return this.msg.toUpperCase();
                }
            },
            // 计算属性本质上也是一个函数，使用的时候当作属性来用
            // 他是基于他的依赖来急性缓存的
            computed:{
                Upper2(){
                    return this.msg.toUpperCase();
                }
            },
            // 监听属性
            watch:{
                // 这里放的是监听的属性，名字不能随便起
                // 只要数据变更了，就会执行指定的代码段
                num1:function(newV,oldV){
                    console.log(newV,oldV);
                    this.num3 = this.num1 + this.num2;
                },
                // 上下两种书写方式都可以，直接写函数，是省略了handler
                obj:function(){
                    console.log('OBJ 改变了，但是监听不到里面abc的变化');
                },
                obj:{
                    handler:function(){
                        console.log('obj变了，并且能检测到abc的变化');
                    },
                    // 深度监听属性
                    deep:true
                }
            }
            // watch 与computed的区别
            // watch可以将依赖分开来监听
            // watch可以放一些异步的任务，或者开销比较大的操作
        })
    </script>
</body>
</html>